#pragma once

<%- getApiDefine(api) %>

#include "playfab/PlayFabBaseModel.h"

namespace PlayFab
{
    namespace <%- api.name %>Models
    {
        // <%- api.name %> Enums<%
for (var enumIdx = 0; enumIdx < enumtypes.length; enumIdx++) { var enumtype = enumtypes[enumIdx]; %>
        enum <%- enumtype.name %>
        {
            <% for(var i=0; i<enumtype.enumvalues.length-1; i++) { var enumval = enumtype.enumvalues[i] %><%- enumtype.name %><%- enumval.name %>,
            <% } %><%- enumtype.name %><%- enumtype.enumvalues[enumtype.enumvalues.length-1].name %>
        };

        inline void ToJsonEnum(const <%- enumtype.name %> input, web::json::value& output)
        {
<% for(var i=0; i<enumtype.enumvalues.length; i++) { var enumval = enumtype.enumvalues[i]
%>            if (input == <%- enumtype.name %><%- enumval.name %>) output = web::json::value(L"<%- enumval.name %>");
<% } %>        }
        inline void FromJsonEnum(const web::json::value& input, <%- enumtype.name %>& output)
        {
            if (!input.is_string()) return;
            const utility::string_t& inputStr = input.as_string();
<% for(var i=0; i<enumtype.enumvalues.length; i++) { var enumval = enumtype.enumvalues[i]
%>            if (inputStr == L"<%- enumval.name %>") output = <%- enumtype.name %><%- enumval.name %>;
<% } %>        }
<% } %>
        // <%- api.name %> Classes<%
for (var typeIdx = 0; typeIdx < sortedClasses.length; typeIdx++) { var datatype = sortedClasses[typeIdx]; %>
        struct <%- datatype.name %> : public <%- getBaseType(datatype) %>
        {
<% for (var propIdx = 0; propIdx < datatype.properties.length; propIdx++) { var property = datatype.properties[propIdx];
%><%- getPropertyDefinition("            ", property, datatype) %>
<% } %>
            <%- datatype.name %>() :
                <%- getBaseType(datatype) %>()<%
for (var propIdx = 0; propIdx < datatype.properties.length; propIdx++) { var property = datatype.properties[propIdx];
%>,
                <%- getPropertySafeName(property) %>()<% } %>
            {}

            <%- datatype.name %>(const <%- datatype.name %>&<%- ifHasProps(datatype, " src") %>) :
                <%- getBaseType(datatype) %>()<%
for (var propIdx = 0; propIdx < datatype.properties.length; propIdx++) { var property = datatype.properties[propIdx];
%>,
                <%- getPropertySafeName(property) %>(src.<%- getPropertySafeName(property) %>)<% } %>
            {}

            ~<%- datatype.name %>() { }

            void FromJson(web::json::value&<%- ifHasProps(datatype, " input") %>) override
            {
<% for (var propIdx = 0; propIdx < datatype.properties.length; propIdx++) { var property = datatype.properties[propIdx];
%><%- getPropertyFromJson("                ", property, datatype) %>
<% } %>            }

            web::json::value ToJson() const override
            {
                web::json::value output;
<% for (var propIdx = 0; propIdx < datatype.properties.length; propIdx++) { var property = datatype.properties[propIdx];
%><%- getPropertyToJson("                ", property, datatype) %>
<% } %>                return output;
            }
        };
<% } %>
    }
}

#endif
